package br.org.etec.dotcao.ws;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import br.org.etec.dotcao.exception.InvalidCredentialException;
import br.org.etec.dotcao.exception.UserNotLoggedIn;
import br.org.etec.dotcao.mailer.Receiver;
import br.org.etec.dotcao.mailer.Sender;
import br.org.etec.dotcao.model.User;
import br.org.etec.dotcao.service.MailService;
import br.org.etec.dotcao.service.ServiceFactory;
import br.org.etec.dotcao.service.UserService;
import br.org.etec.dotcao.service.jpa.UserServiceImpl;
import br.org.etec.dotcao.utils.SessionUtils;

@Path("/users")
public class UserResource {
	
	@GET
	@Produces({MediaType.APPLICATION_JSON})
	public List<User> all(){
		return new UserServiceImpl().all();
	}
	
	@GET
	@Path("/register/{email}")
	@Produces({MediaType.APPLICATION_JSON})
	public Message canRegister(@PathParam("email") String email){
		User user = new User();
		user.setUsername(email);
		user.setPassword("dot123456!");
		
		try {
			user.save();
			Sender sender = new Sender("Dotcao", "maildotcao@gmail.com", "123@#qwe");
			Receiver receiver = new Receiver(email, email);
			
			MailService mail = new MailService();
			mail.sender(sender)
			    .receiver(receiver)
			    .content("send_mail.html")
			    .subject("Solicitaçãoo de Registro")
			    .send();
			
			return new Message("SUCESSO", "Seu registro foi recebido com sucesso. Você receberá um e-mail para que possa completar seu cadastro");
		} catch (Exception e) {
			e.printStackTrace();
			return new Message("ERRO", "Não foi possível efetuar o seu registro. Tente novamente mais tarde");
		}
	}
	
	@POST
	@Path("/register/save")
	@Produces({MediaType.APPLICATION_JSON})
	@Consumes({MediaType.APPLICATION_JSON})
	public Message save(@Context HttpServletRequest request, User user){
		if(user == null){
			return new Message("ERRO", "Não foi possível salvar o usuário. Dados inválidos.");
		}
		
		UserService service = new UserServiceImpl();
		User stored = service.getByEmail(user.getUsername());
		
		if(stored==null){
			return new Message("ERRO", "Falha ao tentar o cadastramento. Nenhuma solicitação encontrada.");
		}
		
		try {
			stored.setAddress(user.getAddress());
			stored.setBirthday(user.getBirthday());
			stored.setFirstname(user.getFirstname());
			stored.setGender(user.getGender());
			stored.setLastname(user.getLastname());
			stored.setOauthInfo(user.getOauthInfo());
			stored.setPassword(user.getPassword());
			stored.update();
			SessionUtils.putInSession(request, stored);
			return new Message("SUCESSO", "Dados salvos com sucesso.");
		} catch (Exception e) {
			return new Message("ERRO", "Ocorreu um erro ao salvar os dados. Tente novamente mais tarde.");
		}
	}

	@POST
	@Path("/auth")
	@Produces({MediaType.APPLICATION_JSON})
	public Message auth(@Context HttpServletRequest request, @FormParam("username") String username, @FormParam("password") String password){
		UserService service = (UserService) ServiceFactory.get(User.class);
		
		try {
			User authenticated = service.authenticate(username, password);
			SessionUtils.putInSession(request, authenticated);
			return new Message("SUCESSO", "Seja bem vindo(a), " + authenticated.getFirstname());
		} catch (InvalidCredentialException e) {
			return new Message("ERRO", "Credenciais inválidas...");
		}
	}
	
	@GET
	@Path("/loggedin")
	@Produces({MediaType.APPLICATION_JSON})
	public User loggedIn(@Context HttpServletRequest request){
		try {
			return SessionUtils.logged(request);
		} catch (UserNotLoggedIn e) {
//			e.printStackTrace();
			return new User();
		}
	}
}
